<!doctype html>
<html>
  <head>
    <meta charset="utf-8" />
    <meta
      name="viewport"
      content="width=device-width, initial-scale=1, maximum-scale=1"
    />
    <title>上传组件 - layui</title>

    <link rel="stylesheet" href="./assets/dist/css/layui.css" />

    <style>
      .layui-upload-img {
        width: 92px;
        height: 92px;
        margin: 0 10px 10px 0;
      }
      hr {
        margin: 32px 0;
      }
    </style>
  </head>
  <body class="layui-padding-5">
    <div class="layui-upload">
      <button type="button" class="layui-btn" id="test1" name="123">
        上传图片
      </button>

      <div class="layui-upload-list">
        <img class="layui-upload-img" src="" id="demo1" />
        <p id="demoText"></p>
      </div>
    </div>

    <div
      class="layui-progress layui-progress-big"
      lay-showPercent="yes"
      lay-filter="demo"
    >
      <div class="layui-progress-bar" lay-percent=""></div>
    </div>

    <hr />

    <div class="layui-upload">
      <button type="button" class="layui-btn" id="test2">多图片上传</button>
      <div class="layui-upload-list" id="demo2"></div>
    </div>

    <hr />

    <div class="layui-upload">
      <button type="button" class="layui-btn layui-btn-normal" id="testList">
        选择多文件
      </button>
      <div class="layui-upload-list">
        <table class="layui-table">
          <thead>
            <th>文件名</th>
            <th>大小</th>
            <th>上传进度</th>
            <th>操作</th>
          </thead>
          <tbody id="demoList"></tbody>
        </table>
      </div>
      <button type="button" class="layui-btn" id="testListAction">
        开始上传
      </button>
    </div>

    <hr />

    <div class="layui-btn-container">
      <button
        type="button"
        class="layui-btn test333"
        lay-data="{size:10,url:'a'}"
        id="test3"
      >
        <i class="layui-icon">&#xe67c;</i>上传文件
      </button>
      <button
        type="button"
        class="layui-btn layui-btn-primary test333"
        lay-data="{size:20,url:'b'}"
        id="test33"
      >
        <i class="layui-icon">&#xe67c;</i>换个样式
      </button>

      <button type="button" class="layui-btn" id="test4">
        <i class="layui-icon">&#xe67c;</i>上传视频
      </button>
      <button type="button" class="layui-btn" id="test5">
        <i class="layui-icon">&#xe67c;</i>上传音频
      </button>
    </div>

    <hr />

    <div class="layui-btn-container">
      <button class="layui-btn testm" lay-data="{url: '/a/'}">
        参数设在元素上
      </button>
      <button
        class="layui-btn testm"
        lay-data="{url: '/b/', accept: 'file',size:5}"
      >
        参数设在元素上
      </button>
    </div>

    <hr />

    <div class="layui-btn-container">
      <button type="button" class="layui-btn layui-btn-normal" id="test6">
        选择文件
      </button>
      <button type="button" class="layui-btn" id="test7">开始上传</button>
    </div>

    <hr />
    <br />

    <div class="layui-upload-drag" id="test8">
      <i class="layui-icon">&#xe67c;</i>
      <p>点击上传，或将文件拖拽到此处</p>
    </div>

    <hr />
    <br />

    绑定原始文件域：<input type="file" name="file" id="test9" />

    <script
      src="./assets/dist/layui.js"
      src1="https://cdnjs.cloudflare.com/ajax/libs/layui/2.7.6/layui.js"
    ></script>
    <script>
      layui.use(['upload', 'element', 'form'], () => {
        var $ = layui.$;
        var upload = layui.upload;
        var element = layui.element;

        // 模拟接口
        var url = ''; // 'https://httpbin.org/post';

        // 创建实例
        var uploadInst = upload.render({
          elem: '#test1',
          url: url, // 若需模拟上传过程，而不真实上传文件，可使用开源的 HTTP 模拟接口: httpbin
          // size: 2000, //限制文件大小，单位 KB
          // accept: 'file',
          method: 'get',
          fileAccept: 'image/*',
          exts: 'jpg|png|gif|bmp|jpeg|pdf',
          data: {
            // 额外参数
            a: 1,
            b: () => 2,
          },
          choose: (obj) => {
            console.log('choose', obj);
          },
          before: (obj) => {
            //预读本地文件示例，不支持ie8
            obj.preview((index, file, result) => {
              $('#demo1').attr('src', result); //图片链接（base64）
            });

            return;
            layer.msg('不允许上传');
            return false;
          },
          done: (res, index) => {
            //如果上传失败
            if (res.code > 0) {
              return layer.msg('上传失败');
            }
            //上传成功
            console.log(res, index);
          },
          error: function (index, upload) {
            this.item.html('重选上传');

            //演示失败状态，并实现重传
            var demoText = $('#demoText');
            demoText.html(
              '<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-mini demo-reload">重试</a>',
            );
            demoText.find('.demo-reload').on('click', () => {
              uploadInst.upload();
            });

            element.progress('demo', '0%');
          },
          progress: (n, elem, res, index) => {
            console.log(n + '%', elem, res, index); //获取进度百分比
            element.progress('demo', n + '%'); //可配合 layui 进度条元素使用
          },
        });

        // 重载上述实例
        uploadInst.reload({
          field: 'avatar',
          accept: 'images', // 只允许上传图片
          acceptMime: 'image/*', // 只筛选图片
          // size: 2,
        });

        // 演示多图片上传
        upload.render({
          elem: '#test2',
          url: url, // 实际使用时改成您自己的上传接口即可
          multiple: true, // 多文件
          unified: true, // 一起上传 ---  2.8.8+
          accept: 'images',
          number: 3, // 同时上传的数量
          size: 1024,
          before: (obj) => {
            // 预读本地文件示例，不支持ie8
            obj.preview((index, file, result) => {
              $('#demo2').append(
                '<img src="' +
                  result +
                  '" alt="' +
                  file.name +
                  '" class="layui-upload-img">',
              );
            });

            // this.files = obj.pushFile();
          },
          done: (res, index) => {
            // 上传完毕
            console.log(res, index);
          },
          allDone: (obj) => {
            console.log(obj);
          },
        });

        // 演示多文件列表 ---  本示例仅演示未开启 unified 属性的情况
        var demoListView = $('#demoList');
        var uploadListIns = upload.render({
          elem: '#testList',
          url: url, // 实际使用时改成您自己的上传接口即可
          accept: 'file',
          multiple: true,
          number: 5,
          auto: false,
          bindAction: '#testListAction',
          // size: 30,
          choose: function (obj) {
            var files = (this.files = obj.pushFile()); // 将每次选择的文件追加到文件队列
            //读取本地文件
            obj.preview((index, file, result) => {
              var tr = $(
                [
                  '<tr id="upload-' + index + '">',
                  '<td>' + file.name + '</td>',
                  '<td>' + (file.size / 1014).toFixed(1) + 'kb</td>',
                  '<td><div class="layui-progress" lay-filter="progress-' +
                    index +
                    '"><div class="layui-progress-bar" lay-percent=""></div></div></td>',
                  '<td>',
                  '<button class="layui-btn layui-btn-xs demo-reload layui-hide">重传</button>',
                  '<button class="layui-btn layui-btn-xs layui-btn-danger demo-delete">删除</button>',
                  '</td>',
                  '</tr>',
                ].join(''),
              );

              //单个重传
              tr.find('.demo-reload').on('click', () => {
                obj.upload(index, file);
              });
              tr.find('.demo-delete').on('click', () => {
                console.log(files, index);
                delete files[index]; //删除对应的文件
                tr.remove();
                uploadListIns.config.elem.next()[0].value = ''; //清空 input file 值，以免删除后出现同名文件不可选
              });

              demoListView.append(tr);

              element.render('progress');
            });
          },
          done: function (res, index, upload) {
            //if(res.code == 0){ //上传成功
            var tr = demoListView.find('tr#upload-' + index),
              tds = tr.children();
            tds.eq(3).html(''); //清空操作
            delete this.files[index]; //删除文件队列已经上传成功的文件
            return;
            //}
            this.error(index, upload);
          },
          allDone: (obj) => {
            console.log(obj);
          },
          error: (index, upload) => {
            var tr = demoListView.find('tr#upload-' + index),
              tds = tr.children();
            tds.eq(3).find('.demo-reload').removeClass('layui-hide'); //显示重传
          },
          progress: (n, elem, e, index) => {
            console.log(n);
            console.log(index);
            element.progress('progress-' + index, n + '%'); //进度条
          },
        });

        upload.render({
          elem: '.test333',
          url: url,
          accept: 'file',
          choose: function (obj) {
            console.log(this.elem);
          },
          done: (res) => {
            console.log(res);
          },
        });

        upload.render({
          elem: '.testm',
          done: function (res, index, upload) {
            //获取当前触发上传的元素，一般用于 elem 绑定 class 的情况，注意：此乃 layui 2.1.0 新增
            var item = this.item;
          },
        });

        /*
  upload.render({
    elem: '#test33',
    url: '',
    accept: 'file',
    done: function(res){
      console.log(res)
    }
  });*/

        upload.render({
          elem: '#test4',
          url: url, // 实际使用时改成您自己的上传接口即可
          accept: 'video',
          done: (res) => {
            console.log(res);
          },
        });

        upload.render({
          elem: '#test5',
          url: '',
          accept: 'audio',
          done: (res) => {
            console.log(res);
          },
        });

        //手动上传
        upload.render({
          elem: '#test6',
          url: url, // 实际使用时改成您自己的上传接口即可
          auto: false,
          // multiple: true,
          bindAction: '#test7',
          choose: function (obj) {
            obj.preview((index, file) => {
              this.elem.after(
                '<span class="layui-inline layui-upload-choose">' +
                  file.name +
                  '</span>',
              );
              console.log(file.name);
              //obj.resetFile(index, file, '123.jpg');
            });
          },
          before: () => {
            console.log(345);
          },
          done: (res) => {
            console.log(res);
          },
        });

        upload.render({
          elem: '#test8',
          url: url, // 实际使用时改成您自己的上传接口即可
          done: (res) => {
            console.log(res);
          },
        });

        upload.render({
          elem: '#test9',
          url: url, // 实际使用时改成您自己的上传接口即可
          done: (res) => {
            console.log(res);
          },
        });
      });
    </script>
  </body>
</html>
